def function(a,c):
    print(a+c)

# function(1,2)

# 定义一个函数
# 定义形参时，可以为形参指定默认值
# 指定了默认值以后，如果用户传递了参数则默认值没有任何作用
#   如果用户没有传递，则默认值就会生效
def fun(a=1,b=2,c=3):
    print(a+b+c)
# fun(5)

# def fn3(a):
#     a[0] = 10
#     print(a,id(a))
# b = [1,2,3]
# fn3(b.copy())
# print(b,id(b))

# 定义一个函数，可以求任意个数字的和
def sum(*nums):
    result = 0
    for n in nums:
        result+=n
    print(result)
# sum(1,2,3,4)

# *a会接受所有的位置实参，并且会将这些实参统一保存到一个元组中（装包）
# 可变参数不是必须写在最后，但是注意，带*的参数后的所有参数，必须以关键字参数的形式传递
def fu2(a,b,*c):
    print(a,b,c)
# fu2(1,2,3,4,5)
def fu3(a,*b,c):
    print(a,b,c)
# fu3(1,2,3,c=4)


# **形参可以接收其他的关键字参数，它会将这些参数统一保存到一个字典中
#   字典的key就是参数的名字，字典的value就是参数的值
# **形参只能有一个，并且必须写在所有参数的最后

def fn4(b,c,**a) :
    print('a =',a,type(a))
    print('b =',b)
    print('c =',c)
fn4(b=1,d=2,c=3,e=10,f=20)

# def fn5(a,b,c):
#     '''
#     :param a:
#     :param b:
#     :param c:
#     :return:
#     '''
#     print('a =',a)
#     print('b =',b)
#     print('c =',c)
# d = {'a':100,'b':200,'c':300}
# fn5(**d)

# def factorial(n):
#     if n==1:
#         return 1
#     return n*factorial(n-1)
# print(factorial(9))

def fn(a:int,b:bool,c:str='hello') -> int:
    '''
    这是一个文档字符串的示例

    函数的作用：。。。。。
    函数的参数：
        a，作用，类型，默认值。。。。
        b，作用，类型，默认值。。。。
        c，作用，类型，默认值。。。。
    '''
    return 10

help(fn)
